function openLock(deadends: string[], target: string): number {
    let map:Map<number,boolean>=new Map();
    let visited: boolean[] = new Array(10000).fill(true);
    deadends.forEach( e => {
        visited[parseInt(e)] = false;
    })
    let ret: number =0,targetNum: number = parseInt(target);
    let stack: number[] = Array.of(0);
    if(targetNum === 0 && visited[0]) {
        return 0;
    }
    if(!visited[0]){
        return -1;
    }
    function generatePath(now: number): number[] {
        let digits: number[] = new Array(4).fill(0); 
        let i=0; 
        while(now>0){
            digits[i]=now%10;
            now=Math.floor(now/10);
            i++;
        }
        let paths: number[] = [];
        let total: number = digits.reduce((t,n,i) => {
            return t+n*Math.pow(10,i);
        })
        digits.forEach( (d,i) => {
            paths.push(total-d*Math.pow(10,i)+((d+10+1)%10)*Math.pow(10,i));
            paths.push(total-d*Math.pow(10,i)+((d+10-1)%10)*Math.pow(10,i));
        })
        return paths;
    }
    while(stack.length!=0){
        let newstack: number[] = [];
        for(let current of stack){
            for(let p of generatePath(current)){
                if(p === targetNum){
                    return ret+1;
                }
                if(visited[p]){
                    newstack.push(p);
                    visited[p]=false;
                }
            }
        }
        ret++;
        stack=newstack;
    }
    return -1;
};

// 执行用时：
// 184 ms
// , 在所有 TypeScript 提交中击败了
// 92.11%
// 的用户
// 内存消耗：
// 45.2 MB
// , 在所有 TypeScript 提交中击败了
// 93.42%
// 的用户